import { AxiosRequestConfig } from "axios";
import request from "./request";
import { message } from "antd";

interface RequestOptions extends AxiosRequestConfig {
  showErrorMessage?: boolean;
}

// 错误处理函数
const handleError = (error: any) => {
  if (error.response) {
    const { status, data } = error.response;
    // 处理不同的错误状态码
    switch (status) {
      case 401:
        // 未授权处理
        message.error("请重新登录");
        // 可以在这里添加重定向到登录页的逻辑
        break;
      case 403:
        message.error("没有权限访问");
        break;
      case 404:
        message.error("请求的资源不存在");
        break;
      case 500:
        message.error("服务器错误");
        break;
      default:
        message.error(data.message || "请求失败");
    }
  } else if (error.request) {
    message.error("网络请求失败，请检查网络连接");
  } else {
    message.error("请求配置错误");
  }
  return Promise.reject(error);
};

/**
 * GET请求
 * @param url - 请求地址
 * @param params - 请求参数
 * @param options - 额外配置选项
 */
export const getAction = <T = any>(
  url: string,
  params?: any,
  options: RequestOptions = {}
): Promise<T> => {
  return request({
    url,
    method: "get",
    params,
    ...options,
  }).catch(handleError);
};

/**
 * POST请求
 * @param url - 请求地址
 * @param data - 请求数据
 * @param options - 额外配置选项
 */
export const postAction = <T = any>(
  url: string,
  data?: any,
  options: RequestOptions = {}
): Promise<T> => {
  return request({
    url,
    method: "post",
    data,
    ...options,
  }).catch(handleError);
};

/**
 * PUT请求
 * @param url - 请求地址
 * @param data - 请求数据
 * @param options - 额外配置选项
 */
export const putAction = <T = any>(
  url: string,
  data?: any,
  options: RequestOptions = {}
): Promise<T> => {
  return request({
    url,
    method: "put",
    data,
    ...options,
  }).catch(handleError);
};

/**
 * DELETE请求
 * @param url - 请求地址
 * @param data - 请求数据
 * @param options - 额外配置选项
 */
export const deleteAction = <T = any>(
  url: string,
  data?: any,
  options: RequestOptions = {}
): Promise<T> => {
  return request({
    url,
    method: "delete",
    data,
    ...options,
  }).catch(handleError);
};
